home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / cmds / raidioc / raidioc.c < prev   
C/C++ Source or Header  |  1992-02-29  |  6KB  |  218 lines

  1. /* 
  2.  * raidioc.c --
  3.  *
  4.  *    Initiates RAID IO-control operations.
  5.  *
  6.  * Copyright 1989 Regents of the University of California
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software and its documentation for any purpose and without
  9.  * fee is hereby granted, provided that the above copyright
  10.  * notice appear in all copies.  The University of California
  11.  * makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without
  13.  * express or implied warranty.
  14.  */
  15.  
  16. #ifndef lint
  17. static char rcsid[] = "$Header: /sprite/lib/forms/RCS/proto.c,v 1.2 89/01/07 04:12:18 rab Exp $ SPRITE (Berkeley)";
  18. #endif /* not lint */
  19.  
  20. #include <sys/file.h>
  21. #include <stdio.h>
  22. #include "dev/raid.h"
  23.  
  24. #define OUT_BUF_SIZE 256
  25. #define IN_BUF_SIZE 4096
  26.  
  27. char        inBuf[IN_BUF_SIZE];
  28. RaidIOCParam    *IOCParam = (RaidIOCParam *) inBuf;
  29. char         outBuf[OUT_BUF_SIZE]; /* buffer for messages returned by IOC */
  30. char        *cmdName;
  31.  
  32.  
  33. /*
  34.  *----------------------------------------------------------------------
  35.  *
  36.  * PrintUsage --
  37.  *
  38.  *    Prints correct usage of command.
  39.  *
  40.  * Results:
  41.  *    None.
  42.  *
  43.  * Side effects:
  44.  *    Prints correct usage.
  45.  *
  46.  *----------------------------------------------------------------------
  47.  */
  48.  
  49. void
  50. PrintUsage()
  51. {
  52.     printf("Usage:\n");
  53.     printf("\t%s <dev> print\n", cmdName);
  54.     printf("\t%s <dev> reconfig configfile\n", cmdName);
  55.     printf("\t%s <dev> lock\n", cmdName);
  56.     printf("\t%s <dev> unlock\n", cmdName);
  57.     printf("\t%s <dev> enable\n", cmdName);
  58.     printf("\t%s <dev> disable\n", cmdName);
  59.     printf("\t%s <dev> savestate\n", cmdName);
  60.     printf("\t%s <dev> enablelog\n", cmdName);
  61.     printf("\t%s <dev> disablelog\n", cmdName);
  62.     printf("\t%s <dev> hardinit <startStripe> <numStripe> [<uSec>]\n",cmdName);
  63.     printf("\t%s <dev> paritycheck <startStripe> <numStripe> [<uSec>]\n",cmdName);
  64.     printf("\t%s <dev> fail <row> <col>\n", cmdName);
  65.     printf("\t%s <dev> replace <row> <col> <type> <unit>\n", cmdName);
  66.     printf("\t%s <dev> reconstruct <row> <col> [<numSector> <uSec>]\n",cmdName);
  67.     printf("\t%s <dev> restorestate <type> <unit> <offset>\n",cmdName);
  68. }
  69.  
  70.  
  71. /*
  72.  *----------------------------------------------------------------------
  73.  *
  74.  * main --
  75.  *
  76.  *    Initiates IOC's.
  77.  *
  78.  * Results:
  79.  *    None.
  80.  *
  81.  * Side effects:
  82.  *    Depends on IOC.
  83.  *
  84.  *----------------------------------------------------------------------
  85.  */
  86.  
  87. main(argc, argv)
  88.     int         argc;
  89.     char       **argv;
  90. {
  91.     int         fd;
  92.     int         configFd;
  93.     int         status;
  94.     int         IOCcmd;
  95.     int         n;
  96.  
  97.     cmdName = *argv;
  98.     argc--; argv++;
  99.  
  100.     if (argc < 1) {
  101.     PrintUsage();
  102.     return(1);
  103.     }
  104.     fd = open(*argv, O_RDONLY, 0);
  105.     if (fd < 0) {
  106.     fprintf(stderr, "Error: could not open device '%s'\n", *argv);
  107.     return(2);
  108.     }
  109.     argc--; argv++;
  110.  
  111.     if (argc < 1) {
  112.     PrintUsage();
  113.     return(-1);
  114.     }
  115.     if (strcmp("print", *argv) == 0) {
  116.     IOCcmd = IOC_DEV_RAID_PRINT; argc--; argv++;
  117.     } else if (strcmp("reconfig", *argv) == 0) {
  118.     IOCcmd = IOC_DEV_RAID_RECONFIG; argc--; argv++;
  119.     if (argc < 1) {
  120.         PrintUsage();
  121.         return(-1);
  122.     }
  123.     configFd = open(*argv, O_RDONLY, 0666);
  124.     if (configFd < 0) {
  125.         fprintf(stderr, "Error: could not open device '%s'\n", *argv);
  126.         return(2);
  127.     }
  128.     argc--; argv++;
  129.     n = read(configFd, IOCParam->buf, IN_BUF_SIZE-1-sizeof(RaidIOCParam));
  130.     IOCParam->buf[n] = 0;
  131.     close(configFd);
  132.     puts(IOCParam->buf);
  133.     status = Fs_IOControl(fd, IOCcmd, sizeof(RaidIOCParam)+n+1, IOCParam,
  134.          OUT_BUF_SIZE, outBuf);
  135.     printf("status:%d\n", status);
  136.     return status;
  137.     } else if (strcmp("hardinit", *argv) == 0) {
  138.     IOCcmd = IOC_DEV_RAID_HARDINIT; argc--; argv++;
  139.     if (argc < 2) {
  140.         PrintUsage();
  141.         return(-1);
  142.     }
  143.     IOCParam->startStripe = atoi(*argv); argc--; argv++;
  144.     IOCParam->numStripe = atoi(*argv); argc--; argv++;
  145.     } else if (strcmp("paritycheck", *argv) == 0) {
  146.     IOCcmd = IOC_DEV_RAID_PARITYCHECK; argc--; argv++;
  147.     if (argc < 2) {
  148.         PrintUsage();
  149.         return(-1);
  150.     }
  151.     IOCParam->startStripe = atoi(*argv); argc--; argv++;
  152.     IOCParam->numStripe = atoi(*argv); argc--; argv++;
  153.     } else if (strcmp("fail", *argv) == 0) {
  154.     IOCcmd = IOC_DEV_RAID_FAIL; argc--; argv++;
  155.     if (argc < 2) {
  156.         PrintUsage();
  157.         return(-1);
  158.     }
  159.     IOCParam->row = atoi(*argv); argc--; argv++;
  160.     IOCParam->col = atoi(*argv); argc--; argv++;
  161.     } else if (strcmp("replace", *argv) == 0) {
  162.     IOCcmd = IOC_DEV_RAID_REPLACE; argc--; argv++;
  163.     if (argc < 4) {
  164.         PrintUsage();
  165.         return(-1);
  166.     }
  167.     IOCParam->row = atoi(*argv); argc--; argv++;
  168.     IOCParam->col = atoi(*argv); argc--; argv++;
  169.     IOCParam->type = atoi(*argv); argc--; argv++;
  170.     IOCParam->unit = atoi(*argv); argc--; argv++;
  171.     } else if (strcmp("reconstruct", *argv) == 0) {
  172.     IOCcmd = IOC_DEV_RAID_RECONSTRUCT; argc--; argv++;
  173.     if (argc < 4) {
  174.         PrintUsage();
  175.         return(-1);
  176.     }
  177.     IOCParam->row = atoi(*argv); argc--; argv++;
  178.     IOCParam->col = atoi(*argv); argc--; argv++;
  179.     IOCParam->numStripe = atoi(*argv); argc--; argv++;
  180.     IOCParam->uSec = atoi(*argv); argc--; argv++;
  181.     } else if (strcmp("lock", *argv) == 0) {
  182.     IOCcmd = IOC_DEV_RAID_LOCK; argc--; argv++;
  183.     } else if (strcmp("unlock", *argv) == 0) {
  184.     IOCcmd = IOC_DEV_RAID_UNLOCK; argc--; argv++;
  185.     } else if (strcmp("enable", *argv) == 0) {
  186.     IOCcmd = IOC_DEV_RAID_ENABLE; argc--; argv++;
  187.     } else if (strcmp("disable", *argv) == 0) {
  188.     IOCcmd = IOC_DEV_RAID_DISABLE; argc--; argv++;
  189.     } else if (strcmp("savestate", *argv) == 0) {
  190.     IOCcmd = IOC_DEV_RAID_SAVE_STATE; argc--; argv++;
  191.     } else if (strcmp("enablelog", *argv) == 0) {
  192.     IOCcmd = IOC_DEV_RAID_ENABLE_LOG; argc--; argv++;
  193.     } else if (strcmp("disablelog", *argv) == 0) {
  194.     IOCcmd = IOC_DEV_RAID_DISABLE_LOG; argc--; argv++;
  195.     } else if (strcmp("restorestate", *argv) == 0) {
  196.     IOCcmd = IOC_DEV_RAID_RESTORE_STATE; argc--; argv++;
  197.     if (argc < 3) {
  198.         PrintUsage();
  199.         return(-1);
  200.     }
  201.     IOCParam->type = atoi(*argv); argc--; argv++;
  202.     IOCParam->unit = atoi(*argv); argc--; argv++;
  203.     IOCParam->startStripe = atoi(*argv); argc--; argv++;
  204.     } else {
  205.     PrintUsage();
  206.     return(-1);
  207.     }
  208.  
  209. printf("ROW %d:COL %d:TYPE %d:UNIT %d:START_STRIPE %d:NUM_STRIPE %d:USEC %d\n",
  210.         IOCParam->row, IOCParam->col, IOCParam->type, IOCParam->unit,
  211.     IOCParam->startStripe, IOCParam->numStripe, IOCParam->uSec);
  212.     status = Fs_IOControl(fd, IOCcmd, sizeof(RaidIOCParam), IOCParam, OUT_BUF_SIZE, outBuf);
  213.     printf("status:%d\n", status);
  214.     outBuf[OUT_BUF_SIZE] = '\0';
  215.     puts(outBuf);
  216.     exit(status);
  217. }
  218.